
// 所有的 JavaScript 类 都扩展自 Object 类

// 通过 Object 类 的 构造函数来创建实例
let x = new Object();
console.log( x ); // { }
console.log( x.toString() ); // [object Object]

// 1、定义了一个函数
// 2、定义了一个变量( 变量名是 Student )
// 3、定义了一个"对象"(类级别对象)
// 4、定义了一个构造函数
function Student(id,name){
    this.id = id ;
    this.name = name ;
}

// 通过自定义构造函数来创建实例
let s = new Student( 1001 , '张翠山' );
console.log( s );
console.log( s.toString() );
console.log( typeof s );

class Course extends Object {
    constructor(id,name){
        console.log( 'Course构造函数' );
        // 当一个类显式使用extends继承了另一个类时
        // 在其构造函数内使用this之前必须首先用super调用父类构造
        super(); // 调用父类构造函数
        this.id = id ;
        this.name = name ;
    }
}

// 通过自定义构造函数来创建实例
let c = new Course( 11 , 'JavaScript' );
console.log( c );
console.log( c.toString() );
console.log( typeof x );

// 通过 "对象字面量" 来创建实例
// 本质上是创建了 Object 类的一个实例并为其设置实例属性
let py = {
    id: 22 ,
    name: '派森',
    credit: 2
}

console.log( py );
console.log( py.toString() );
console.log( typeof py );

let yp = new Object();
console.log( yp ); // { }
// 动态为实例添加属性
yp.id = 22 ;
yp.name = '森派' ;
yp.credit = 2 ;

console.log( yp ); // { id: 22 , name: '森派' , credit: 2 }
console.log( yp.toString() ); // [object Object]
console.log( typeof yp ); // object

// 创建实例的两种方法:
// 1、通过 构造函数 来创建实例:  new Object() 、 new Student() 、new Course()
// 2、通过 对象字面量 来创建实例: let x = { id : 22 , name: '老姜' }